use std::env;
use std::fs;
use std::path::Path;

fn main() {
    // 获取项目根目录
    let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
    // 获取输出目录（通常是 target/debug 或 target/release）
    let out_dir = env::var("OUT_DIR").unwrap();
    // 计算输出目录的上级路径，直到找到 target/debug 或 target/release 的父目录
    // 注意：OUT_DIR 通常指向更深层的目录（如 target/debug/build/.../out），所以需要向上回溯
    let target_dir = Path::new(&out_dir)
        .parent().unwrap() // build/.../out -> build/...
        .parent().unwrap() // build/... -> target/debug
        .parent().unwrap(); // target/debug -> target (如果你需要 target 这一级)

    // 定义要复制的源目录（相对于项目根目录）
    let src_config_dir = Path::new(&manifest_dir).join("config");
    // 定义目标目录（我们直接放到 target/debug/config 下）
    let dest_config_dir = target_dir.join("config"); // 对于 debug 构建

    // 创建目标目录（如果不存在）
    fs::create_dir_all(&dest_config_dir).unwrap();
    // 复制整个 config 目录
    copy_dir_all(&src_config_dir, &dest_config_dir).unwrap();

    // 如果你想在 release 构建时也复制，可以判断一下 profile
    // 但注意：构建脚本在一次编译中只为一个 profile 运行
    // 通常做法是分别运行 `cargo build` 和 `cargo build --release`，它们会各自触发 build.rs
    let is_release = env::var("PROFILE").unwrap() == "release";
    if is_release {
        let dest_config_dir_release = target_dir.join("release").join("config");
        fs::create_dir_all(&dest_config_dir_release).unwrap();
        copy_dir_all(&src_config_dir, &dest_config_dir_release).unwrap();
    }
}

// 一个递归复制目录的辅助函数
fn copy_dir_all(src: impl AsRef<Path>, dst: impl AsRef<Path>) -> std::io::Result<()> {
    fs::create_dir_all(&dst)?;
    for entry in fs::read_dir(src)? {
        let entry = entry?;
        let ty = entry.file_type()?;
        if ty.is_dir() {
            copy_dir_all(entry.path(), dst.as_ref().join(entry.file_name()))?;
        } else {
            fs::copy(entry.path(), dst.as_ref().join(entry.file_name()))?;
        }
    }
    Ok(())
}